package controllers.GestionTratamientoDatos.Metodos.Correccion.Metodos;

import controllers.GestionTratamientoDatos.Metodos.Correccion.MetodoCorreccionBase;
import models.Hidregistro;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: Daniel
 * Date: 22/04/13
 * Time: 11:10 AM
 * To change this template use File | Settings | File Templates.
 */
public class RegresionLineal extends MetodoCorreccionBase {

    public double pendiente;
    public double constante;

    public int numeroElementos = 0;
    public double mediaX = 0;
    public double mediaY = 0;
    public double SXY = 0;
    public double SX2 = 0;

    List<Hidregistro> serieEstacion;

    public RegresionLineal(List<Hidregistro> serieEntrada) {
        super(serieEntrada);
    }

    public void RealizarRegresion(List<Hidregistro> serieEstacionNueva)
    {

        numeroElementos = getSerieEntrada().size();
        //System.out.println("numeroElementosisize: " + numeroElementos);
        setSerieEstacion(serieEstacionNueva);
        //System.out.println("4.1.1");
        HallarMediasAritmeticas();
        //System.out.println("4.1.2");
        HallarSumatoriasXY();
        //System.out.println("4.1.3");
        CalcularPendiente();
        //System.out.println("4.1.4");
        CalcularConstante();
    }

    public void HallarMediasAritmeticas()
    {
        for (int i = 0; i < numeroElementos; i++)
        {
            mediaX += getSerieEntrada().get(i).getRegval();
            mediaY += serieEstacion.get(i).getRegval();
        }

        mediaX /= numeroElementos;
        mediaY /= numeroElementos;
        //System.out.println("mediaX: " + mediaX);
        //System.out.println("mediaY: " + mediaY);
    }

    public void HallarSumatoriasXY()
    {
        for (int i = 0; i < numeroElementos; i++)
        {
            SXY += (getSerieEntrada().get(i).getRegval() - mediaX) * (serieEstacion.get(i).getRegval() - mediaY);
            SX2 += Math.pow(getSerieEntrada().get(i).getRegval() - mediaX, 2);
        }

        //System.out.println("sumXY: " + SXY);
        //System.out.println("sumX2: " + SX2);
    }

    public void CalcularPendiente()
    {
        //b = ((1/N)*SXY)/((1/N)*SX2);
        //System.out.println("numElem: " + numeroElementos);
        //System.out.println("SXY: " + SXY);
        //System.out.println("SX: " + SX2);
        double  numerador = (1 / (double)(numeroElementos)) * SXY;
        //System.out.println("numerador: " + numerador);
        double denominador = (1 / (double)(numeroElementos)) * SX2;
        //System.out.println("denominador: " + denominador);
        //System.out.println("pendiente: " + numerador/denominador);
        //pendiente = ((1 / numeroElementos) * SXY)/((1 / numeroElementos) * SX2);
        pendiente = numerador/denominador;
    }

    public void CalcularConstante()
    {
        //a = Ymed - (b * Xmed);
        constante = mediaY - (pendiente * mediaX);
    }

    public List<Hidregistro> getSerieEstacion() {
        return serieEstacion;
    }

    public void setSerieEstacion(List<Hidregistro> serieEstacion) {
        this.serieEstacion = serieEstacion;
    }

    public double getPendiente() {
        return pendiente;
    }

    public void setPendiente(double pendiente) {
        this.pendiente = pendiente;
    }

    public double getConstante() {
        return constante;
    }

    public void setConstante(double constante) {
        this.constante = constante;
    }
}
